משפטי בקרה ולולאות שעור מס. 3 דרור טובי דר' 1 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
- הקדמה משפט התנאי if המשימה: ברצוננו לכתוב תוכנית המקבלת שני מספרים בסדר כל שהוא ולהדפיס אותם בסדר עולה. קלט a, b אם a >= b אם a < b System.out.println(b+ +a) System.out.println(a+ +b) כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 2
משפט התנאי if תנאי True (1) הוראה False (0) משפט לפקודה יחידה משפט if מרובה תנאים if if( condition ) { statement 1; statement 2;... statement n; if( condition ) single statement; כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 3
תוכנית לסידור שני מספרים א' public class OrderIf { public static void main(string[] args) { double a = Double.parseDouble( args[0] ); double b = Double.parseDouble( args[1] ); if( a < b ) System.out.println(a + " " + b); if( a >= b ) System.out.println(b + " " + a); $ java OrderIf 3 5 3.0 5.0 $ java OrderIf 5 3 3.0 5.0 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 4
פקודת if/else False (0) הוראה א תנאי הוראה ב True (1) משפט if-else לפקודה יחידה משפט if-else מרובה תנאים if( condition ) { statement 1;... else { statement 1;... כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 5 if( condition ) single statement; else single statement;
תוכנית לסידור שני מספרים ב' public class OrderIf1 { public static void main(string[] args) { double a = Double.parseDouble( args[0] ); double b = Double.parseDouble( args[1] ); if( a < b ) System.out.println(a + " " + b); else System.out.println(b + " " + a); $ java OrderIf1 3 5 3.0 5.0 $ java OrderIf1 5 3 3.0 5.0 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 6
משפטים מורכבים if ( grade >= 60 ) System.out.println("Passed"); else { System.out.println("Failed"); System.out.println("You need to take the test again"); if ( grade >= 60 ) System.out.println("Passed"); else System.out.println("Failed"); System.out.println("You need to take the test again"); טעויות לוגיות אינן מתגלות על ידי המהדר כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 7
תנאי if/else מקוננים if ( grade == 100 ) System.out.println("Excellent"); else if( grade >= 90 ) System.out.println("Very good"); else if( grade >= 80 ) System.out.println("Very good"); else if( grade >= 60 ) System.out.println("passed"); else System.out.println("failed"); כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 8
חישוב שורש ריבועי 9 4 2 3 2?? כיצד נחשב שורש של 2 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 9
האלגוריתם הבבלי לחישוב שורש נרצה לחשב את השורש של c נניח ש t הוא השורש של c אזי מתקיים ש t=c/t 1) נתחיל בניחוש אקראי כל שהוא של מספר חיובי t 2) כל עוד (t-c/t) >ε כאשר הוא מספר חיובי קטן מאד (3 נבצע / 2.0 ) t t = ( c/t + התוצאה תתכנס לקבלת השורש הבבלים חיו במסופוטמיה עד 539 לפני בספירה )גבול סוריה/עירק( כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 10
x 0 600.0 1 x ( x0 2 1 x ( x1 2 1 x ( x2 2 1 x ( x3 2 1 x ( x4 2 דוגמא Calculate, c where c = 125348 c 1 125348 ) (600.0 ) 2 600.0 404.457 c 1 125348 ) (404.457 ) 2 404.457 357.187 c 1 125348 ) (357.187 ) 2 357.187 354.059 c 1 125348 ) (354.059 ) x3 2 354.059 354.045 c 1 125348 ) (354.045 ) x 2 354.045 354.045 1 x0 2 x1 3 x2 4 5 4 125348 354.045 כל הזכויות שמורות דר ' דרור טובי המרכז האוניברסיטאי אריאל 11
משפט החזרה while תנאי true משפטי ביצוע false int i = 1; int sum = 0; ועד 5 לדוגמא סכימת המספרים מ 1 while ( i < 5 ) { sum = sum + i; i = i + 1; 12 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
public class Power2 { טור החזקות של 2 public static void main(string[] args) { int N = Integer.parseInt( args[0] ); int v = 1; int i = 0; while( i < N ) { System.out.println("2^" + i + " = " + v); v = 2 * v; i = i + 1; $ java Power2 8 2^0 = 1 2^1 = 2 2^2 = 4 2^3 = 8 2^4 = 16 2^5 = 32 2^6 = 64 2^7 = 128 13 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
תוכנית לחישוב שורש ריבועי public class Sqrt { public static void main(string[] args) { double c = Double.parseDouble( args[0] ); double epsilon = 1e-9; double t = c; // initial guess while( Math.abs(t - c/t) > epsilon ) { // replace t by average of t and c/t t = 0.5 * (c/t +t); System.out.println(t); $ java Sqrt 4 2.000000000000002 $ java Sqrt 125348 354.04519485512014 14 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
הוראות השמה את ההוראה a = a + 3; ניתן לכתוב גם a += 3; קיצור פסוק מלא פסוק מקוצר += a = a + b; a += b; -= a = a - b; a -= b; *= a = a * b; a *= b; /= a = a / b; a /= b; %= a = a % b; a %= b; 15 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
השמה דוגמאות int c=3, d=5, e=4, f=6, g=12; c += 6; d += f; e += 1; d -= 5; c -= g; e -= f; d *= 4; f *= c; g *= 2; f /= g; g /= f; d /= 3; g %= f; f %= e; d %= e; 16 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
הגדלה והקטנה למספר עוקב הגדלת הערך של a ב 1 ושימוש בערכו החדש ;a++ שימוש בערכו בנוכחי של a ואז הגדלת ערכו ב ;++a 1 הקטנת הערך של a ב 1 ושימוש בערכו בחדש ;a-- a--; שימוש בערכו בנוכחי של a ואז הקטנת ערכו ב 1 17 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
דוגמאות a = 3; System.out.println( a ); System.out.println( ++a ); System.out.println( a++ ); System.out.println( a ); a = 3; System.out.println( a ); System.out.println( --a ); System.out.println( a-- ); System.out.println( a ); a = 3; ++a; System.out.println( a ); a=3; a++; System.out.println( a ); System.out.println(++a); 18 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
לולאת ה for i = 1 תנאי true cout << i ++i false שינוי משתנה הלולאה תנאי הלולאה איתחול משתנה הלולאה for( int i=1; i<=10; ++i) System.out.println( i ); for( int i=1; i<=10; i+=2) System.out.println( i ); השווה
לולאת ה for המשך for( int i=10; i>1; --i) System.out.println( i ); השוה for( int i=1; i<=10; --i) System.out.println( i ); טעות לוגית הגורמת ללולאה אין סופית
לולאת do/while do { statement statement; true while (condition); תנאי false
- דוגמא א לולאת do/while public class Dowhile { public static void main(string[] args) { int counter = 1; do { System.out.println(counter ); ++counter; while ( counter <= 5 ); $ java Dowhile 1 2 3 4 5 22 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
- דוגמא ב לולאת do/while public class Dowhile { public static void main(string[] args) { int counter = 6; do { System.out.println(counter ); ++counter; while ( counter <= 5 ); $ java Dowhile 6 23 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
פקודת break פקודת break מביאה לסיום ויציאה מידית מהלולאה public class Tmp { public static void main(string[] args) { for(int i=1; i<=5; ++i) { System.out.println( i ); if( i == 3 ) break; $ java Tmp 1 2 3 24 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
public class Tmp { פקודת continue public static void main(string[] args) { for(int i=1; i<=10; ++i) { if( (i%2) == 0 ) continue; System.out.println( i ); $ java Tmp 1 3 5 7 9 25 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
סימולציית הימורים מהמר מבצע סידרת הימורים, כאשר כל הימור הוא על סך 1 שח'.1 2. המהמר מפסיק להמר באחד משני המייקרים: 1. הוא איבד את כל כספו אותו סיכן )stake( 2. הוא הרוויח את הסכום אותו קבע מראש )goal( כל הימור הוא הוגן, כלומר ההסתברות לנצח או להפסיד היא 0.5.3 26 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
public class Gambler { סימולציית מהמר public static void main(string[] args) { int stake = Integer.parseInt(args[0]); // initial stake int goal = Integer.parseInt(args[1]); // walkaway goal int T = Integer.parseInt(args[2]); // number of trials int bets = 0; int wins = 0; for( int t=0; t<t; ++t) { // One experiment int cash = stake; while( cash > 0 && cash < goal ) { // One bet ++bets; if( Math.random() < 0.5 ) ++cash; else if( cash == goal ) wins ++; --cash; System.out.println( (100*wins/T) + "% wins"); System.out.println( "Avg # bets: " + bets/t); 27 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
תוצאות הסימולציה $ java Gambler 50 1000 10000 5% wins Avg # bets: 48981 dror@dror-1 ~/java $ java Gambler 50 900 10000 5% wins Avg # bets: 41710 dror@dror-1 ~/java $ java Gambler 50 800 10000 6% wins Avg # bets: 38228 28 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל
Goal/Stake ניתוח תוצאות הסימולציה Stake Goal Goal/Stake %win 50 100 2 49 50 200 4 24 50 300 6 17 50 400 8 12 50 500 10 10 50 600 12 8 50 700 14 7 50 800 16 6 50 900 18 5 50 1000 20 5 50 1100 22 4 50 1200 24 4 50 1300 26 3 50 1400 28 3 50 1500 30 3 50 1600 32 3 50 1700 34 3 50 1800 36 2 60 50 40 30 20 10 0 Gambler %win 0 5 10 15 20 25 30 35 40 %win 29 כל הזכויות שמורות דר' דרור טובי המרכז האוניברסיטאי אריאל